package com.chizha.iot.mqtt.client;

/**
*
* Description:
* @author admin
* 2017年2月10日下午18:04:07
*/

import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;

import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import com.jfinal.log.Log;

import com.chizha.iot.mqtt.server.MessageHandleController;

/**
* 发布消息的回调类
*
* 必须实现MqttCallback的接口并实现对应的相关接口方法CallBack 类将实现 MqttCallBack。
* 每个客户机标识都需要一个回调实例。在此示例中，构造函数传递客户机标识以另存为实例数据。
* 在回调中，将它用来标识已经启动了该回调的哪个实例。
* 必须在回调类中实现三个方法：
*
*  public void messageArrived(MqttTopic topic, MqttMessage message)接收已经预订的发布。
*
*  public void connectionLost(Throwable cause)在断开连接时调用。
*
*  public void deliveryComplete(MqttDeliveryToken token))
*  接收到已经发布的 QoS 1 或 QoS 2 消息的传递令牌时调用。
*  由 MqttClient.connect 激活此回调。
*
*/
public class PushCallback implements MqttCallback {

	static String prevlousData = "";
	static String checkPrevlousTopic = "";
	static long prevlousTime = 0l;

	private static Log logger = Log.getLog(PushCallback.class);
	
   public void connectionLost(Throwable cause) {
	   // 连接丢失后，一般在这里面进行重连
	   logger.info("连接断开，可以做重连"+cause.getMessage());
      
       ClientMQTT.getInstance().reconnect();
   }

   public void deliveryComplete(IMqttDeliveryToken token) {
       //System.out.println("deliveryComplete---------" + token.isComplete());
   }
   long prevoiusBody = 0;
   public void messageArrived(String topic, MqttMessage message) throws Exception {
	   String data = new String(message.getPayload());
	   byte[] bdata = message.getPayload();
	   //logger.info(new String(bdata));
	   if(checkPrevlousTopic.equals(topic) && prevlousData.equals(data) && (System.currentTimeMillis() - prevlousTime < 2000)){
		   logger.info(data);
		   logger.info("duplicate ------------ : " + prevlousData);
		   return;
	   }
	   try{
		   
			   MessageHandleController.getInstance().arrivedMqttMsg(topic, bdata);
		   
	   }catch(Exception e){
		   logger.error(e.toString(),e);
	   }
	   prevlousData = data;
	   prevlousTime = System.currentTimeMillis();
	   checkPrevlousTopic = topic;
   }
}